package org.jiuling.basics.validation;

import org.jiuling.basics.exception.BasicsRuntimeException;

import java.io.InputStream;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 断言
 * @author 紫灵
 * @date 2024年03月08日 21时05分05秒
 */
public class Assertions {

    /** 私有构造方法，禁止创建对象 */
    private Assertions(){}

    /**
     * 断言为True，如果不为true则断言失败
     * @param promptMessage 提示信息
     * @param param 布尔类型参数
     */
    public static void isTrue(String promptMessage,boolean param ) throws BasicsRuntimeException {
        if(!param){
            throw new BasicsRuntimeException(promptMessage);
        }
    }

    /**
     * 断言为False，如果为true则断言失败
     * @param promptMessage 提示信息
     * @param param 布尔类型参数
     */
    public static void isFalse(String promptMessage,boolean param ) throws BasicsRuntimeException {
        if(param){
            throw new BasicsRuntimeException(promptMessage);
        }
    }

    /**
     * 字符串断言
     */
    public static class StringAssertions{

        /** 私有构造方法，禁止创建对象 */
        private StringAssertions(){}

        /**
         * 是空
         * @param promptMessage 提示信息
         * @param str 字符串
         */
        public static void isNull(String promptMessage,String str){
            isTrue(promptMessage,StringVerify.isNull(str));
        }

        /**
         * 不是空
         * @param promptMessage 提示信息
         * @param str 字符串
         */
        public static void isNotNull(String promptMessage,String str){
            isFalse(promptMessage,StringVerify.isNull(str));
        }

        /**
         * 是空白
         * @param promptMessage 提示信息
         * @param str 字符串
         */
        public static void isBlank(String promptMessage,String str){
            isTrue(promptMessage,StringVerify.isBlank(str));
        }

        /**
         * 不是空白
         * @param promptMessage 提示信息
         * @param str 字符串
         */
        public static void isNotBlank(String promptMessage,String str){
            isFalse(promptMessage,StringVerify.isBlank(str));
        }

        /**
         * 全部为空白
         * @param promptMessage 提示信息
         * @param strs 字符串列表
         */
        public static void allIsBlank(String promptMessage,String... strs){
            isTrue(promptMessage,StringVerify.allIsBlank(strs));
        }

        /**
         * 全部存在
         * @param promptMessage 提示信息
         * @param strs 字符串列表
         */
        public static void allIsExist(String promptMessage,String... strs){
            isTrue(promptMessage,StringVerify.allIsExist(strs));
        }

        /**
         * 是数字
         * @param promptMessage 提示信息
         * @param str 字符串
         */
        public static void isNumeric(String promptMessage,String str){
            isTrue(promptMessage,StringVerify.isNumeric(str));
        }

    }

    /**
     * Set集合断言
     */
    public static class SetAssertions{

        /** 私有构造方法，禁止创建对象 */
        private SetAssertions(){}

        /**
         * 为空
         * @param promptMessage 提示信息
         * @param array 数组
         */
        public static void isEmpty(String promptMessage,Set<?> array){
            isTrue(promptMessage,SetVerify.isEmpty(array));
        }

        /**
         * 不为空
         * @param promptMessage 提示信息
         * @param array 数组
         */
        public static void isNotEmpty(String promptMessage,Set<?> array){
            isFalse(promptMessage,SetVerify.isEmpty(array));
        }

    }

    /**
     * 对象断言
     */
    public static class ObjectAssertions{

        /** 私有构造方法，禁止创建对象 */
        private ObjectAssertions(){}

        /**
         * 为空
         * @param promptMessage 提示信息
         * @param obj 对象
         */
        public static void isNull(String promptMessage,Object obj){
            isTrue(promptMessage,ObjectVerify.isNull(obj));
        }

        /**
         * 不为空
         * @param promptMessage 提示信息
         * @param obj 对象
         */
        public static void isNotNull(String promptMessage,Object obj){
            isFalse(promptMessage,ObjectVerify.isNull(obj));
        }

        /**
         * 是基础数据
         * @param promptMessage 提示信息
         * @param obj 对象
         */
        public static void isBaseType(String promptMessage,Object obj){
            isTrue(promptMessage,ObjectVerify.isBaseType(obj));
        }

    }

    /**
     * Map集合断言
     */
    public static class MapAssertions{

        /** 私有构造方法，禁止创建对象 */
        private MapAssertions() {}

        /**
         * 为空白
         * @param promptMessage 提示信息
         * @param map map集合
         */
        public static void isBlank(String promptMessage,Map<?,?> map){
            isTrue(promptMessage,MapVerify.isNull(map));
        }

        /**
         * 不用为空白
         * @param promptMessage 提示信息
         * @param map map集合
         */
        public static void isNotBlank(String promptMessage,Map<?,?> map){
            isFalse(promptMessage,MapVerify.isNull(map));
        }

        /**
         * 为空
         * @param promptMessage 提示信息
         * @param map map集合
         */
        public static void isNull(String promptMessage,Map<?,?> map){
            isTrue(promptMessage,MapVerify.isNull(map));
        }

        /**
         * 不为空
         * @param promptMessage 提示信息
         * @param map map集合
         */
        public static void isNotNull(String promptMessage,Map<?,?> map){
            isFalse(promptMessage,MapVerify.isNull(map));
        }
    }

    /**
     * 长整形断言
     */
    public static class LongAssertions{

        /** 私有构造方法，禁止创建对象 */
        private LongAssertions() {}

        /**
         * 为空白
         * @param promptMessage 提示信息
         * @param lon 长整形
         */
        public static void isBlank(String promptMessage,Long lon){
            isTrue(promptMessage,LongVerify.isBlank(lon));
        }

        /**
         * 不为空白
         * @param promptMessage 提示信息
         * @param lon 长整形
         */
        public static void isNotBlank(String promptMessage,Long lon){
            isFalse(promptMessage,LongVerify.isBlank(lon));
        }

        /**
         * 为空
         * @param promptMessage 提示信息
         * @param lon 长整型
         */
        public static void isNull(String promptMessage,Long lon){
            isTrue(promptMessage,LongVerify.isNull(lon));
        }

        /**
         * 不为空
         * @param promptMessage 提示信息
         * @param lon 长整型
         */
        public static void isNotNull(String promptMessage,Long lon){
            isFalse(promptMessage,LongVerify.isNull(lon));
        }
    }

    /**
     * 列表断言
     */
    public static class ListAssertions{

        /** 私有构造方法，禁止创建对象 */
        private ListAssertions() {}

        /**
         * 为空白
         * @param promptMessage 提示信息
         * @param list 列表
         */
        public static void isEmpty(String promptMessage,List<?> list){
            isTrue(promptMessage,ListVerify.isEmpty(list));
        }

        /**
         * 不用为空白
         * @param promptMessage 提示信息
         * @param list 列表
         */
        public static void isNotEmpty(String promptMessage,List<?> list){
            isFalse(promptMessage,ListVerify.isEmpty(list));
        }

        /**
         * 为空
         * @param promptMessage 提示信息
         * @param list 列表
         */
        public static void isNull(String promptMessage,List<?> list){
            isTrue(promptMessage,ListVerify.isNull(list));
        }

        /**
         * 不为空
         * @param promptMessage 提示信息
         * @param list 列表
         */
        public static void isNotNull(String promptMessage,List<?> list){
            isFalse(promptMessage,ListVerify.isNull(list));
        }

    }

    /**
     * 时间断言
     */
    public static class DateAssertions{

        /** 私有构造方法，禁止创建对象 */
        private DateAssertions() {}

        /**
         * 为空
         * @param promptMessage 提示信息
         * @param date 时间
         */
        public static void isNull(String promptMessage,Date date){
            isTrue(promptMessage,DateVerify.isNull(date));
        }

        /**
         * 不为空
         * @param promptMessage 提示信息
         * @param date 时间
         */
        public static void isNotNull(String promptMessage,Date date){
            isFalse(promptMessage,DateVerify.isNull(date));
        }

    }

    /**
     * 整形断言
     */
    public static class IntegerAssertions{

        /** 私有构造方法，禁止创建对象 */
        private IntegerAssertions() {}

        /**
         * 为空白
         * @param promptMessage 提示信息
         * @param inte 整形
         */
        public static void isBlank(String promptMessage,Integer inte){
            isTrue(promptMessage,IntegerVerify.isBlank(inte));
        }

        /**
         * 不为空白
         * @param promptMessage 提示信息
         * @param inte 整形
         */
        public static void isNotBlank(String promptMessage,Integer inte){
            isFalse(promptMessage,IntegerVerify.isBlank(inte));
        }


        /**
         * 为空
         * @param promptMessage 提示信息
         * @param inte 整形
         */
        public static void isNull(String promptMessage,Integer inte){
            isTrue(promptMessage,IntegerVerify.isNull(inte));
        }


        /**
         * 不为空
         * @param promptMessage 提示信息
         * @param inte 整形
         */
        public static void isNotNull(String promptMessage,Integer inte){
            isFalse(promptMessage,IntegerVerify.isNull(inte));
        }
    }

    /**
     * 输入流断言
     */
    public  static class InputStreamAssertions{

        /** 私有构造方法，禁止创建对象 */
        private InputStreamAssertions(){}

        /**
         * 为空白
         * @param promptMessage 提示信息
         * @param inputStream 输入流
         */
        public static void isEmpty(String promptMessage, InputStream inputStream){
            isTrue(promptMessage,InputStreamVerify.isEmpty(inputStream));
        }

        /**
         * 不为空白
         * @param promptMessage 提示信息
         * @param inputStream 输入流
         */
        public static void isNotEmpty(String promptMessage, InputStream inputStream){
            isFalse(promptMessage,InputStreamVerify.isEmpty(inputStream));
        }


    }
}
